package algutil.fichier;

import java.io.File;
import java.io.IOException;

import org.apache.log4j.Logger;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.AudioHeader;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.TagException;
import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
import org.jaudiotagger.tag.id3.ID3v1Tag;

import algutil.console.Console;

public class FichierMp3 {

	private static final Logger log = Logger.getLogger(FichierMp3.class);

	private File fichierMp3 = null;

	public FichierMp3(File f) {
		fichierMp3 = f;
	}

	public File getFichierMp3() {
		return fichierMp3;
	}

	public void setFichierMp3(File fichierMp3) {
		this.fichierMp3 = fichierMp3;
	}

	public boolean hasID3v1Tag() throws CannotReadException, IOException,
			TagException, ReadOnlyFileException, InvalidAudioFrameException {

		return ((MP3File) AudioFileIO.read(fichierMp3)).hasID3v1Tag();
	}

	public boolean hasID3v2Tag() throws CannotReadException, IOException,
			TagException, ReadOnlyFileException, InvalidAudioFrameException {

		return ((MP3File) AudioFileIO.read(fichierMp3)).hasID3v2Tag();
	}

	public AudioHeader getAudioHeader() throws CannotReadException,
			IOException, TagException, ReadOnlyFileException,
			InvalidAudioFrameException {
		AudioFile f = AudioFileIO.read(fichierMp3);
		return f.getAudioHeader();
	}

	public ID3v1Tag getID3v1Tag() throws CannotReadException, IOException,
			TagException, ReadOnlyFileException, InvalidAudioFrameException {

		MP3File f = (MP3File) AudioFileIO.read(fichierMp3);
		return f.getID3v1Tag();
	}

	public AbstractID3v2Tag getID3v2Tag() throws CannotReadException,
			IOException, TagException, ReadOnlyFileException,
			InvalidAudioFrameException {

		MP3File f = (MP3File) AudioFileIO.read(fichierMp3);
		return f.getID3v2Tag();
	}
	
	public String toStringAudioHeader() {

		try {
			AudioHeader ah = getAudioHeader();
			return Console.construireLigne("Header") + "\n" + "Bit rate    : "
					+ ah.getBitRate() + "\n" + "Sample rate : "
					+ ah.getSampleRate() + "\n" + "Duree       : "
					+ ah.getTrackLength() + " sec\n"
					+ Console.construireLigne();
		} catch (Exception e) {
			log.error("Erreur a l'extraction des info header mp3", e);
			return "<erreur info header>";
		}
	}

	/** @deprecated */
	public String toStringID3v1() {

		try {
			if (hasID3v1Tag()) {
				ID3v1Tag tag = getID3v1Tag();
				return Console.construireLigne("ID3v1")
						+ "\n"
						/*+ Console.formatterLignes("Artiste : "
								+ tag.getFirstArtist() + "\n" + "Annee : "
								+ tag.getFirstYear() + "\n" + "Album : "
								+ tag.getFirstAlbum() + "\n" + "Num : "
								+ tag.getFirstTrack() + "\n" + "Titre : "
								+ tag.getFirstTitle() + "\n" + "Commentaire : "
								+ tag.getFirstComment() + "\n" + "Genre : "
								+ tag.getFirstGenre() + "\n")*/
						+ Console.construireLigne();
			} else {
				return "<aunune information ID3v1>\n";
			}
		} catch (Exception e) {
			log.error("Erreur a l'extraction des info ID3", e);
			return "<erreur information ID3v1>";
		}
	}

	/** @deprecated */
	public String toStringID3v2() {

		try {
			if (hasID3v2Tag()) {
				AbstractID3v2Tag tag = getID3v2Tag();
				return Console.construireLigne("ID3v2")
						+ "\n"
						/*+ Console.formatterLignes("Artiste : "
								+ tag.getFirstArtist() + "\n" + "Annee : "
								+ tag.getFirstYear() + "\n" + "Album : "
								+ tag.getFirstAlbum() + "\n" + "Num : "
								+ tag.getFirstTrack() + "\n" + "Titre : "
								+ tag.getFirstTitle() + "\n" + "Commentaire : "
								+ tag.getFirstComment() + "\n" + "Genre : "
								+ tag.getFirstGenre() + "\n")*/
						+ Console.construireLigne();
			} else {
				return "<aunune information ID3v2>\n";
			}
		} catch (Exception e) {
			log.error("Erreur a l'extraction des info ID3", e);
			return "<erreur information ID3v2>";
		}
	}

	/** @deprecated */
	public String toString() {
		StringBuffer sb = new StringBuffer("");
		try {
			AudioHeader ah = getAudioHeader();
			sb.append(Console.construireLigne("Header") + "\n");
			sb.append(Console.formatterLignes("Path : " + fichierMp3.getPath()
					+ "\n" + "Bit rate    : " + ah.getBitRate() + "\n"
					+ "Sample rate : " + ah.getSampleRate() + "\n"
					+ "Duree       : " + ah.getTrackLength() + " sec\n"));
			sb.append(Console.construireLigne("ID3v1") + "\n");
			if (hasID3v1Tag()) {
				ID3v1Tag tag = getID3v1Tag();
				/*sb.append(Console.formatterLignes("Artiste : "
						+ tag.getFirstArtist() + "\n" + "Annee : "
						+ tag.getFirstYear() + "\n" + "Album : "
						+ tag.getFirstAlbum() + "\n" + "Num : "
						+ tag.getFirstTrack() + "\n" + "Titre : "
						+ tag.getFirstTitle() + "\n" + "Commentaire : "
						+ tag.getFirstComment() + "\n" + "Genre : "
						+ tag.getFirstGenre() + "\n"));*/
			} else {
				sb.append("<Pas d'info ID3v1>\n");
			}
			sb.append(Console.construireLigne("ID3v2") + "\n");
			if (hasID3v2Tag()) {
				AbstractID3v2Tag tag = getID3v2Tag();
				/*sb.append(Console.formatterLignes("Artiste : "
						+ tag.getFirstArtist() + "\n" + "Annee : "
						+ tag.getFirstYear() + "\n" + "Album : "
						+ tag.getFirstAlbum() + "\n" + "Num : "
						+ tag.getFirstTrack() + "\n" + "Titre : "
						+ tag.getFirstTitle() + "\n" + "Commentaire : "
						+ tag.getFirstComment() + "\n" + "Genre : "
						+ tag.getFirstGenre() + "\n"));*/
			} else {
				sb.append("<Pas d'info ID3v2>\n");
			}
			sb.append(Console.construireLigne() + "\n");

		} catch (Exception e) {
			log.error("Erreur a l'extraction des info mp3", e);
			return "<erreur recuperation information fichier mp3>";
		}
		return sb.toString();
	}
}
